From 7932370ef85c22142ba1e0073fd276fb65326eb2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 15 Jul 2014 23:13:43 -0400 Subject: [PATCH] GtkListBox: Style selectable rows differently We now apply the .button style class to rows that are either activatable or selectable. Selectable rows only get the .button if the listbox allows selection. This implies that we need to update row styles when the selection mode changes, or when the row gets added to a listbox. --- gtk/gtklistbox.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c index b07898c77c..a679edba1a 100644 --- a/gtk/gtklistbox.c +++ b/gtk/gtklistbox.c @@ -244,6 +244,9 @@ static void gtk_list_box_multipress_gesture_released (GtkGestureMultiPress *gest gdouble y, GtkListBox *box); +static void gtk_list_box_update_row_styles (GtkListBox *box); +static void gtk_list_box_update_row_style (GtkListBox *box, + GtkListBoxRow *row); static GParamSpec *properties[LAST_PROPERTY] = { NULL, }; static guint signals[LAST_SIGNAL] = { 0 }; @@ -974,6 +977,8 @@ gtk_list_box_set_selection_mode (GtkListBox *box, priv->selection_mode = mode; + gtk_list_box_update_row_styles (box); + g_object_notify_by_pspec (G_OBJECT (box), properties[PROP_SELECTION_MODE]); if (dirty) @@ -2587,6 +2592,7 @@ gtk_list_box_insert (GtkListBox *box, if (ROW_PRIV (row)->visible) list_box_add_visible_rows (box, 1); gtk_list_box_apply_filter (box, row); + gtk_list_box_update_row_style (box, row); if (gtk_widget_get_visible (GTK_WIDGET (box))) { gtk_list_box_update_header (box, ROW_PRIV (row)->iter); @@ -3229,17 +3235,40 @@ gtk_list_box_row_is_selected (GtkListBoxRow *row) } static void -update_row_style (GtkListBoxRow *row) +gtk_list_box_update_row_style (GtkListBox *box, + GtkListBoxRow *row) { GtkStyleContext *context; + gboolean can_select; + + if (box && BOX_PRIV (box)->selection_mode != GTK_SELECTION_NONE) + can_select = TRUE; + else + can_select = FALSE; context = gtk_widget_get_style_context (GTK_WIDGET (row)); - if (ROW_PRIV (row)->activatable) + if (ROW_PRIV (row)->activatable || + (ROW_PRIV (row)->selectable && can_select)) gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON); else gtk_style_context_remove_class (context, GTK_STYLE_CLASS_BUTTON); } +static void +gtk_list_box_update_row_styles (GtkListBox *box) +{ + GSequenceIter *iter; + GtkListBoxRow *row; + + for (iter = g_sequence_get_begin_iter (BOX_PRIV (box)->children); + !g_sequence_iter_is_end (iter); + iter = g_sequence_iter_next (iter)) + { + row = g_sequence_get (iter); + gtk_list_box_update_row_style (box, row); + } +} + /** * gtk_list_box_row_set_activatable: * @row: a #GTkListBoxrow @@ -3261,7 +3290,7 @@ gtk_list_box_row_set_activatable (GtkListBoxRow *row, { ROW_PRIV (row)->activatable = activatable; - update_row_style (row); + gtk_list_box_update_row_style (gtk_list_box_row_get_box (row), row); g_object_notify (G_OBJECT (row), "activatable"); } } @@ -3309,7 +3338,7 @@ gtk_list_box_row_set_selectable (GtkListBoxRow *row, ROW_PRIV (row)->selectable = selectable; - update_row_style (row); + gtk_list_box_update_row_style (gtk_list_box_row_get_box (row), row); g_object_notify (G_OBJECT (row), "selectable"); } } -- 2.30.2